/// <reference types="vitest" />

import { type ConfigEnv, type UserConfigExport, loadEnv, defineConfig } from 'vite'
import path, { resolve } from 'path'
import vue from '@vitejs/plugin-vue'
//支持jsx
import vueJsx from '@vitejs/plugin-vue-jsx'
//Svg
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import svgLoader from 'vite-svg-loader'
// 自动导入vue中hook reactive ref等
import AutoImport from 'unplugin-auto-import/vite'
//pwa
import { VitePWA } from 'vite-plugin-pwa'

export default ({ mode, command }: ConfigEnv): UserConfigExport => {
  console.log(command)
  const viteEnv = loadEnv(mode, process.cwd()) as ImportMetaEnv
  console.log(viteEnv)
  const { VITE_PUBLIC_PATH } = viteEnv
  return defineConfig({
    // 打包时根据实际情况修改 base
    base: VITE_PUBLIC_PATH,
    optimizeDeps: {
      exclude: ['electron']
    },
    // 配置别名
    resolve: {
      alias: {
        '@': resolve(__dirname, './src')
      }
    },
    // 开发环境配置
    server: {
      /** 设置 host: true 才可以使用 Network 的形式，以 IP 访问项目 */
      host: true, // host: "0.0.0.0"
      /** 端口号 */
      port: 3333,
      /** 是否自动打开浏览器 */
      open: false,
      /** 跨域设置允许 */
      cors: true,
      /** 端口被占用时，是否直接退出 */
      strictPort: false,
      /** 接口代理 */
      proxy: {
        '/api/v1': {
          target: 'https://apifoxmock.com/m1/2919886-2056361-default',
          ws: true,
          /** 是否允许跨域 */
          changeOrigin: true
        }
      },
      /** 预热常用文件，提高初始页面加载速度 */
      warmup: {
        clientFiles: ['./src/layouts/**/*.vue']
      }
    },
    // 打包配置
    build: {
      // 指定输出路径
      outDir: resolve(__dirname, 'dist'),
      // 规定触发警告的 chunk 大小
      chunkSizeWarningLimit: 2048,
      // 是否生成 source map
      sourcemap: false,
      /** 禁用 gzip 压缩大小报告 */
      reportCompressedSize: false,
      //Vite 会在构建时清空该目录
      emptyOutDir: true,
      // 打包时清除console和debugger
      terserOptions: {
        compress: {
          keep_infinity: true,
          drop_console: true,
          drop_debugger: true
        }
      },
      // rollup配置
      rollupOptions: {
        output: {
          entryFileNames: 'js/[name].[hash].js',
          chunkFileNames: 'js/[name].[hash].js',
          assetFileNames(assetInfo: any) {
            if (assetInfo.name.endsWith('.css')) {
              return 'css/[name].[hash].css'
            }
            if (['.png', '.jpg', '.jpeg', '.svg'].some(ext => assetInfo.name.endsWith(ext))) {
              return 'imgs/[name].[hash].[ext]'
            }
            return 'assets/[name].[hash].[ext]'
          }
        }
      }
    },
    // Vite 插件
    plugins: [
      vue(),
      vueJsx(),
      /** 将 SVG 静态图转化为 Vue 组件 */
      svgLoader({ defaultImport: 'url' }),
      /** SVG */
      createSvgIconsPlugin({
        iconDirs: [path.resolve(process.cwd(), 'src/icons/svg')],
        symbolId: 'icon-[dir]-[name]'
      }),
      // 自动导入vue中hook reactive ref等
      AutoImport({
        imports: ['vue', 'vue-router'],
        eslintrc: {
          enabled: true
        }
      }),
      //pwa
      VitePWA({
        manifest: {
          name: '应用名称',
          id: 'cs001',
          start_url: 'index.html',
          short_name: '应用名称',
          description: '应用描述',
          theme_color: '#182330',
          background_color: '#FFFF00',
          icons: [
            //添加图标， 注意路径和图像像素正确
            {
              src: '/app-logo.png',
              sizes: '296x296',
              type: 'image/png'
            }
          ],
          //屏幕截图
          screenshots: [
            {
              'src': '/app-logo.png',
              'type': 'image/png',
              'sizes': '296x296',
              'form_factor': 'narrow'
            },
            {
              'src': '/app-logo.png',
              'type': 'image/png',
              'sizes': '296x296',
              'form_factor': 'wide'
            }
          ]
        },
        registerType: 'autoUpdate',
        workbox: {
          // 缓存相关静态资源，这个放开会导致页面html被缓存，谨慎使用
          // globPatterns: ['**/*.{js,css,html,ico,png,jpg,svg}'],
        },
        devOptions: {
          enabled: true
        }
      })
    ],
    /** Vitest 单元测试配置：https://cn.vitest.dev/config */
    test: {
      include: ['tests/**/*.test.ts'],
      environment: 'jsdom'
    }
  })
}
